package com.wz.boot.function.qqzone;

import com.wz.boot.annotation.Function;
import com.wz.boot.annotation.Handle;
import com.wz.boot.pojo.ZoneMsg;
import love.forte.common.ioc.annotation.Depend;
import love.forte.simbot.api.message.MessageContentBuilderFactory;
import love.forte.simbot.api.message.events.PrivateMsg;
import love.forte.simbot.api.sender.Sender;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

@Function(
        priority = 3,
        name = "发生空间动态",
        describe = "可以将你说的内容转发到机器人的空间,从而寻求帮助",
        touch = "空间动态",
        claName = "QQZoneSend",
        valid = false,
        execExit = true
)
@Component
public class QQZoneSend {

    /**
     * 空间动态一下最多发9条消息（图片），故此值的范围在0-9之间
     * 0代表没有图片，只有文本
     * 1-9代表有图片
     */
    private static int maxZoneMsgSize = 9;

    @Depend
    private MessageContentBuilderFactory messageContentBuilderFactory;

    //ZoneMsg队列，最大Size为maxZoneMsgSize
    List<ZoneMsg> zoneMsgList = null;

    // 筹齐9条消息的开始时间
    LocalDateTime localDateTime;

    // 记录被Warn的客户，等下一波开始的时候，通知他们
    List<PrivateMsg> shouldBeNotified = new ArrayList<>();

    /**
     *
     * 1. 低于1小时未筹齐9条消息，继续筹集
     * 2. 1小时内筹齐9条消息的，立刻发送，并重新计时
     * 3. 1小时内没筹齐9条消息的，1小时后，立刻发送，并重新计时
     *
     */

    @Handle
    public void qqZoneSend(PrivateMsg privateMsg, Sender sender){
        if(localDateTime == null){
            /*
                如果没有开始时间，将重置开始时间,并初始化zoneMsgList
                并于此刻开始统计ZoneMsg
             */

            localDateTime = LocalDateTime.now();
            zoneMsgList = new ArrayList<>();
        }
        /*
            1.如果当前时间 > 开始时间+1小时，那么代表1小时时间已经足够，不管此时有没有筹齐，都发送ZoneMsg
            2.如果筹齐了maxZoneMsgSize 也发送ZoneMsg
         */
        if(LocalDateTime.now().isAfter(localDateTime.plusHours(1))  || zoneMsgList.size() >= maxZoneMsgSize){
            //先告诉客户消息正在发送中，无法记录此消息，请等待下次发送
            sender.sendPrivateMsg(privateMsg,"不好意思, 空间消息正在发送中, 请等待下一波...");
            shouldBeNotified.add(privateMsg);
            //通知ZoneMsg发送器发送动态
            boolean sendFlag = qqzoneSend(zoneMsgList);
            if(!sendFlag){
                //如果没有发送成功
                // todo
            }else{
                //将筹齐状态赋值为空
                localDateTime = null;
                zoneMsgList = null;
            }
        }else{
            //将消息加入到ZoneMsg队列
            String accountCode = privateMsg.getAccountInfo().getAccountCode();
            if(containsId(zoneMsgList,accountCode)){
                //此人已在队列中
                //将ZoneMsg追加到ZoneMsgList中
                for (ZoneMsg zoneMsg : zoneMsgList) {
                    if(accountCode.equals(zoneMsg.getAccountCode())){
                        //如果是同一个人
                        zoneMsg.pushPrivateMsg(privateMsg);
                        sender.sendPrivateMsg(privateMsg, "请继续说, 我正在听, 请在"+formatDate(localDateTime.plusHours(1))+"之前诉说完毕");
                        break;
                    }
                }
            }else{
                //此人不在队列中
                ZoneMsg zoneMsg = new ZoneMsg();
                zoneMsg.setAccountCode(accountCode);
                zoneMsg.pushPrivateMsg(privateMsg);
                zoneMsgList.add(zoneMsg);
                //回复此人消息
                sender.sendPrivateMsg(privateMsg, "你的文字已被暂时记录，可以继续诉说，请在"+formatDate(localDateTime.plusHours(1))+"之前诉说完毕");
            }

        }

//        MessageContent msgContent = privateMsg.getMsgContent();
//        sender.sendPrivateMsg(privateMsg, msgContent);

    }

    /**
     * ZoneMsg发送器
     * @param zoneMsgList
     * @return 是否发送成功
     */
    public boolean qqzoneSend(List<ZoneMsg> zoneMsgList){
//        new Timer().schedule(new TimerTask() {
//            @Override
//            public void run() {
//                try {
//                    //do Something
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        },0,5L * 60 * 1000);
        return true;
    }

    private String formatDate(LocalDateTime localDateTime){
        return DateTimeFormatter.ofPattern("HH点mm分ss秒").format(localDateTime);
    }


    /**
     * 是否包含指定Id
     */
    private boolean containsId(List<ZoneMsg> zoneMsgList, String id){
        for (ZoneMsg zoneMsg : zoneMsgList) {
            if(id.equals(zoneMsg.getAccountCode()))
                return true;
        }
        return false;
    }
}
